/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package br.com.clicarros.fachada.implementacao;

import br.com.clicarros.dominio.anuncio.Anuncio;
import br.com.clicarros.dominio.navegacao.Navegacao;
import br.com.clicarros.dominio.perfilusuario.PerfilUsuario;
import br.com.clicarros.dominio.usuario.Usuario;
import br.com.clicarros.dominio.veiculo.Categoria;
import br.com.clicarros.dominio.veiculo.Marca;
import br.com.clicarros.fachada.PerfilUsuarioIFachada;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

/**
 *
 * @author Bruno
 */
public class PerfilUsuarioFachada extends Fachada implements PerfilUsuarioIFachada{
    
    private static Integer ALTA = Integer.valueOf(150);
    private static Integer MEDIA = Integer.valueOf(50);
    private static Integer BAIXA = Integer.valueOf(5);
    private static Integer TOTAL = Integer.valueOf(205);
    private static Double DIFERENCA = Double.valueOf(5000);
    
    @Override
    public void criarPerfil() {
        
        List usuarios =  listarTodos(new Usuario());
        
        for(Object usuario : usuarios){
            
            Navegacao navegacao = new Navegacao();
            
            navegacao.setUsuario((Usuario)usuario);
            
            List navegacoes = consultar(navegacao);
            if(!navegacoes.isEmpty()){
                montarPerfil(navegacoes);
            }
        }
        
        associarAnuncio();
     }
    
    private void montarPerfil(List listaNavegacao){
        
    List<Long> anoFabricacao = new ArrayList<Long>();
    List<Long> anoModelo = new ArrayList<Long>();
    List<Double> valor= new ArrayList<Double>();
    List<String> cor= new ArrayList<String>();
    List<Double> km= new ArrayList<Double>();
    List<Short> nPortas= new ArrayList<Short>();
    List<String> combustivel= new ArrayList<String>();
    List<String> modelo= new ArrayList<String>();
    List<String> motor= new ArrayList<String>();
    List<Marca> marca= new ArrayList<Marca>();
    List<Categoria> categoria= new ArrayList<Categoria>();
        
        
        for(Object navegacao : listaNavegacao){
            
            Navegacao navegacaoLocal = (Navegacao) navegacao;
            anoFabricacao.add(navegacaoLocal.getAnuncio().getAnofabricacao());
            anoModelo.add(navegacaoLocal.getAnuncio().getAnomodelo());
            valor.add(navegacaoLocal.getAnuncio().getValor());
            cor.add(navegacaoLocal.getAnuncio().getCor());
            km.add(navegacaoLocal.getAnuncio().getKm());
            nPortas.add(navegacaoLocal.getAnuncio().getNportas());
            combustivel.add(navegacaoLocal.getAnuncio().getCombustivel());
            modelo.add(navegacaoLocal.getAnuncio().getVeiculo().getModelo());
            motor.add(navegacaoLocal.getAnuncio().getVeiculo().getMotor());
            marca.add(navegacaoLocal.getAnuncio().getVeiculo().getMarca());
            categoria.add(navegacaoLocal.getAnuncio().getVeiculo().getCategoria());
            
        }
        
        PerfilUsuario perfil = new PerfilUsuario();
        perfil.setUsuario(((Navegacao)listaNavegacao.get(0)).getUsuario());
        perfil.setAnoFabricacao((Long)frequencia(anoFabricacao));
        perfil.setAnoModelo((Long)frequencia(anoModelo));
        perfil.setValor((Double)frequencia(valor));
        perfil.setCor((String)frequencia(cor));
        perfil.setKm((Double)frequencia(km));
        perfil.setnPortas((Short)frequencia(nPortas));
        perfil.setCombustivel((String)frequencia(combustivel));
        perfil.setModelo((String)frequencia(modelo));
        perfil.setMotor((String)frequencia(motor));
        perfil.setMarca((Marca)frequencia(marca));
        perfil.setCategoria((Categoria)frequencia(categoria));
        
        excluir(perfil);
        inserir(perfil);
        
        
        
    }
    
    private Object frequencia(List dados){
		Object retorno = null;
		int peso  = 0;
		int frequencia = 0;
		
		for(Object valor : dados){
			frequencia = Collections.frequency(dados, valor);
			if(peso <= frequencia){
				retorno = valor;
				peso = frequencia;
			}
		}

		return retorno;
	}
    
    public void associarAnuncio(){
        
        List<PerfilUsuario> listaPerfil =(List<PerfilUsuario>) listarTodos(new PerfilUsuario());
        
        for(PerfilUsuario perfil : listaPerfil){
            perfil.setAnuncios(associar(perfil, listarTodos(new Anuncio())));
            
            alterar(perfil);
        }
        
    }
    
    public List<Anuncio> associar(PerfilUsuario perfil, List<Anuncio> anuncios){
        Integer pontuacao = Integer.valueOf(0);
        List<Anuncio> listaAnuncio = new ArrayList<Anuncio>();
                
        for(Anuncio anuncio : anuncios){
            pontuacao = Integer.valueOf(0);
            
            if(perfil.getCategoria().equals(anuncio.getVeiculo().getCategoria())){
                pontuacao +=  ALTA;
            }
            if(perfil.getMotor().equals(anuncio.getVeiculo().getMotor())){
                pontuacao +=  ALTA;
            }
            
            if(perfil.getModelo().equals(anuncio.getVeiculo().getModelo())){
                pontuacao += ALTA;
            }
            
            if(perfil.getValor()>= anuncio.getValor() - DIFERENCA 
            && perfil.getValor()<= anuncio.getValor() + DIFERENCA){
                pontuacao+= ALTA;
            }
            
            if(perfil.getMarca().equals(anuncio.getVeiculo().getMarca())){
                pontuacao += MEDIA;
            }
            
            if(perfil.getCombustivel().equals(anuncio.getCombustivel())){
                pontuacao += MEDIA;
            }
            
            if(perfil.getnPortas().equals(anuncio.getNportas())){
                pontuacao += MEDIA;
            }
            
            if(perfil.getAnoFabricacao().equals(anuncio.getAnofabricacao())){
                pontuacao += MEDIA;
            }
            
            if(perfil.getAnoModelo().equals(anuncio.getAnomodelo())){
                pontuacao += MEDIA;
            }
            
            if(perfil.getCor().equals(anuncio.getCor())){
                pontuacao += BAIXA;
            }
            
            if(perfil.getKm().equals(anuncio.getKm())){
                pontuacao += BAIXA;
            }
            
            if(pontuacao >= TOTAL){
                listaAnuncio.add(anuncio);
                
                System.out.println("Usuario:".concat(perfil.getUsuario().getNome()).concat("veiculo").concat(anuncio.getVeiculo().getModelo().concat(pontuacao.toString())));
            }
        }
        
        return listaAnuncio;
    }
    
}
